android Html.fromHtml font 标签支持设置字体大小和颜色

您所在的位置:网站首页 安卓 字体 颜色 android Html.fromHtml font 标签支持设置字体大小和颜色

android Html.fromHtml font 标签支持设置字体大小和颜色

2024-07-12 15:49:21| 来源: 网络整理| 查看: 265

由于在android 中的Html源码中对html标签的支持不是很完全,在使用textview加载html自定义字体样式的时候遇到坑了,就是font标签不支持size属性,查看源码中发现没有去解析size属性

// Html源码部分 private static void startFont(SpannableStringBuilder text, Attributes attributes) { // 解析颜色 String color = attributes.getValue("", "color"); // 解析face String face = attributes.getValue("", "face"); int len = text.length(); text.setSpan(new Font(color, face), len, len, Spannable.SPAN_MARK_MARK); }

所以如下这样写size是没有效果的,只显示颜色

String text = "" + "要显示的数据" + ""; Spanned spanned = Html.fromHtml(text);

==>>>>>>>>>>>>>>>>>>>>>分割线>>>>>>>>>>>>>>>>>>>>>==

由于android对html标签解析最终也是通过各种span进行拼接形成对应的样式:

以下是android中提供的各种span及用途

BackgroundColorSpan 背景色 ClickableSpan 文本可点击,有点击事件 ForegroundColorSpan 文本颜色(前景色) MaskFilterSpan修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter) MetricAffectingSpan 父类,一般不用 RasterizerSpan 光栅效果 StrikethroughSpan 删除线(中划线) SuggestionSpan 相当于占位符 UnderlineSpan 下划线 AbsoluteSizeSpan 绝对大小(文本字体) DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。 ImageSpan 图片 RelativeSizeSpan 相对大小(文本字体) ReplacementSpan 父类,一般不用 ScaleXSpan 基于x轴缩放 StyleSpan 字体样式:粗体、斜体等 SubscriptSpan 下标(数学公式会用到) SuperscriptSpan 上标(数学公式会用到) TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色) TypefaceSpan 文本字体 URLSpan 文本超链接

接下来我们就通过Html.TagHandler来自定义标签实现设置字体大小的功能 此处我定义标签名为:myfont

此处的调用方式如下:

String text = "" + "要显示的数据" + ""; Spanned spanned = Html.fromHtml(text, null, new HtmlTagHandler("myfont"));

关键代码在HtmlTagHandler里面处理自定义标签myfont:

public class HtmlTagHandler implements Html.TagHandler { // 自定义标签名称 private String tagName; // 标签开始索引 private int startIndex = 0; // 标签结束索引 private int endIndex = 0; // 存放标签所有属性键值对 final HashMap attributes = new HashMap(); public HtmlTagHandler(String tagName) { this.tagName = tagName; } @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { // 判断是否是当前需要的tag if (tag.equalsIgnoreCase(tagName)) { // 解析所有属性值 parseAttributes(xmlReader); if (opening) { startHandleTag(tag, output, xmlReader); } else { endEndHandleTag(tag, output, xmlReader); } } } public void startHandleTag(String tag, Editable output, XMLReader xmlReader) { startIndex = output.length(); } public void endEndHandleTag(String tag, Editable output, XMLReader xmlReader) { endIndex = output.length(); // 获取对应的属性值 String color = attributes.get("color"); String size = attributes.get("size"); size = size.split("px")[0]; // 设置颜色 if (!TextUtils.isEmpty(color)) { output.setSpan(new ForegroundColorSpan(Color.parseColor(color)), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } // 设置字体大小 if (!TextUtils.isEmpty(size)) { output.setSpan(new AbsoluteSizeSpan(Integer.parseInt(size)), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } /** * 解析所有属性值 * * @param xmlReader */ private void parseAttributes(final XMLReader xmlReader) { try { Field elementField = xmlReader.getClass().getDeclaredField("theNewElement"); elementField.setAccessible(true); Object element = elementField.get(xmlReader); Field attsField = element.getClass().getDeclaredField("theAtts"); attsField.setAccessible(true); Object atts = attsField.get(element); Field dataField = atts.getClass().getDeclaredField("data"); dataField.setAccessible(true); String[] data = (String[]) dataField.get(atts); Field lengthField = atts.getClass().getDeclaredField("length"); lengthField.setAccessible(true); int len = (Integer) lengthField.get(atts); for (int i = 0; i < len; i++) { attributes.put(data[i * 5 + 1], data[i * 5 + 4]); } } catch (Exception e) { } } }

如果以下方式没有效果:

String text = "" + "要显示的数据" + ""; Spanned spanned = Html.fromHtml(text, null, new HtmlTagHandler("myfont"));

可在myfont标签前面添加一个随意标签实现如:

String text = "

" + "要显示的数据" + "

"; Spanned spanned = Html.fromHtml(text, null, new HtmlTagHandler("myfont"));

如果不想自定义tag显示字体大小和颜色可参考



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭